#include <iostream>
using namespace std;
typedef struct {
    int x, y;
} ElemType;
typedef struct LNode {
    ElemType data;
    struct LNode *next;
} LNode, *LinkList;
void Init(LinkList &L) { // 初始化循环链表
    L = new LNode;
    L->next = L;  // 循环链表，指向自己
}
bool IsEmpty(LinkList L) {// 判断链表是否为空
    return L->next == L;
}
void CreatFront(LinkList &L, int n) {// 头插法建立循环链表
    while(n--) {
        LNode *p = new LNode;
        cin >> p->data.x >> p->data.y;
        p->next = L->next;
        L->next = p;
    }
}
void CreatBack(LinkList &L, int n) { // 尾插法建立循环链表
    LNode *T = L;
    while(n--) {
        LNode *p = new LNode;
        cin >> p->data.x >> p->data.y;
        p->next = L;  // 新节点的next指向头节点
        T->next = p;
        T = p;
    }
}
void Get(LinkList L, int w, ElemType &e) {// 获取第w个元素的值
    if (IsEmpty(L)) return;
    
    LNode *p = L->next;
    int j = 1;
    while(p != L && j < w) {  // 注意循环条件
        p = p->next;
        j++;
    }
    if(p == L || j > w) return;  // 位置无效
    e = p->data;
}
LNode *Locate(LinkList L, ElemType e) {// 查找元素e的位置
    if (IsEmpty(L)) return NULL;
    
    LNode *p = L->next;
    while(p != L && (p->data.x != e.x || p->data.y != e.y)) {
        p = p->next;
    }
    if(p == L) return NULL;  // 没找到
    return p;
}
void Show(LinkList L) { // 输出循环链表
    if (IsEmpty(L)) {
        cout << "链表为空" << endl;
        return;
    }
    LNode *p = L->next;
    while(p != L) {
        cout << p->data.x << " " << p->data.y << endl;
        p = p->next;
    }
}
void Insert(LinkList &L, int w, ElemType e) { // 在第w个位置插入元素e
    LNode *p = L;
    int j = 0;  // 从0开始计数，因为头节点不算
    
    // 找到第w-1个节点
    while(p->next != L && j < w-1) {
        p = p->next;
        j++;
    }
    if(j != w-1) return;  // 位置无效
    LNode *q = new LNode;
    q->data = e;
    q->next = p->next;
    p->next = q;
}
void Delete(LinkList &L, int w) { // 删除第w个元素
    if (IsEmpty(L)) return;
    LNode *p = L;
    int j = 0;
    // 找到第w-1个节点
    while(p->next != L && j < w-1) {
        p = p->next;
        j++;
    }
    if(p->next == L || j != w-1) return;  // 位置无效
    LNode *q = p->next;
    p->next = q->next;
    delete q;
}
int Length(LinkList L) {// 获取链表长度
    int len = 0;
    LNode *p = L->next;
    while(p != L) {
        len++;
        p = p->next;
    }
    return len;
}
void Destroy(LinkList &L) { // 销毁循环链表
    if (L == NULL) return;
    LNode *p = L->next;
    while(p != L) {
        LNode *temp = p;
        p = p->next;
        delete temp;
    }
    delete L;
    L = NULL;
}
void Josephus(LinkList &L, int k) { // 约瑟夫环问题演示
    if (IsEmpty(L)) {
        cout << "链表为空，无法进行约瑟夫环游戏" << endl;
        return;
    }
    cout << "约瑟夫环游戏开始，每次数到第" << k << "个人出列：" << endl;
    LNode *p = L->next;  // 从第一个节点开始
    LNode *prev = L;     // 前驱节点
    // 让prev指向最后一个节点
    while(prev->next != L) {
        prev = prev->next;
    }
    int count = 1;
    while(p->next != p) {  // 只剩一个节点时结束
        if(count == k) {
            // 删除当前节点
            cout << "出列: (" << p->data.x << ", " << p->data.y << ")" << endl;
            prev->next = p->next;
            LNode *temp = p;
            p = p->next;
            delete temp;
            count = 1;
        } else {
            prev = p;
            p = p->next;
            count++;
        }
    }
    cout << "最后剩下: (" << p->data.x << ", " << p->data.y << ")" << endl;
    delete p;
    L->next = L;  // 重置链表为空
}
int main() {
    LinkList L;
    Init(L);
    int n;
    cin >> n;
    CreatBack(L, n);
    Show(L);
    // // 测试插入
    // ElemType e = {100, 200};
    // Insert(L, 2, e);
    // cout << "在第2个位置插入(100,200)后:" << endl;
    // Show(L);
    // // 测试删除
    // Delete(L, 3);
    // cout << "删除第3个节点后:" << endl;
    // Show(L);
    // // 测试约瑟夫环
    // cout << "链表长度: " << Length(L) << endl;
    // Josephus(L, 3);
    // Destroy(L);
    return 0;
}